Skip to main content

Ansible 基本架構

怎麼操作 Ansible

我們可以用 Ad-Hoc command 和 Playbook 兩種方式來操作 Ansible。

前者是透過一次次簡短的指令來操作 Ansible,而後者則是先把任務寫好,然後再一次執行。兩者的關係就好比我們在 Linux Shell 裡打指令和先寫個 Shell Script 再執行一樣。

Ad-Hoc Commands 概念

為一個特定的問題或任務而專門設定的解決方案 。Ad-Hoc Commands 可以翻譯為簡短地指令

在這裡凍仁會用指令操作模式來形容它,以常見的 ping 和 echo 操作為例

  • ping.
ansible all -m ping
server1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
  • echo.
ansible all -m command -a "echo Hello World"
server1 | SUCCESS | rc=0 >>
Hello World

可以看到 Ad-Hoc commands 一次只能處理一件事情,這即是它與 Playbooks 最大的差異。

比較:與傳統運作比較

Shell (command line, cli, console)

  • ping.
ping -c 1 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=44 time=10.022 ms

--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 10.022/10.022/10.022/0.000 ms

  • echo.
echo Hello World
Hello World

Shell Script

#!/bin/bash
echo 'Hello World'
bash hello_world.sh

Playbooks 概念

當確認已經正確地安裝在 control machine 上之後,我們現在就可以準備透過 Ansible 對 managed node 進行部署了。然而,我們要如何告訴 Ansible 我們想要對 managed node 做些什麼呢?在 Ansible 的世界裡,我們是透過編寫劇本 playbook 來告訴 Ansible 接下來需要做的事項。由於 Ansible 的 playbook 是使用 YAML (YAML Ain't Markup Language) 這種標記語言來撰寫,而這個語言最大的特色就是具有高度可讀性,因此無論有沒有程式語言的基礎,理論上任何人在看到一份好的 Ansible playbook 的時候應該都是非常容易理解及著手修改維護的。

在一份 Playbook 中,可以有多個 Play、多個 Task 和多個 Module。

  • Play:通常為某個特定的目的,例如:
    • Setup a official website with Drupal (藉由 Drupal 建置官網)
    • Restart the API service (重開 API 服務)
  • Task:是要實行 Play 這個目地所需做的每個步驟,例如:
    • Install the Nginx (安裝 Nginx)
    • Kill the djnago process (強制停止 django 的行程)
  • Module:Ansible 所提供的各種操作方法,例如:
    • apt: name=vim state=present (使用 apt 套件安裝 vim)
    • command: /sbin/shutdown -r now (使用 shutdown 的指令重新開機)

範例:Hello World Playbook

vi hello_world.yml
- name: say 'hello world'
hosts: all
tasks:

- name: echo 'hello world'
command: echo 'hello world'
register: result

- name: print stdout
debug:
msg: "{{ result.stdout }}"
  • 執行 playbook
ansible-playbook hello_world.yml

PLAY [say 'hello world'] *******************************************************

TASK [setup] *******************************************************************
ok: [server1]

TASK [echo 'hello world'] ******************************************************
changed: [server1]

TASK [print stdout] ************************************************************
ok: [server1] => {
"msg": "hello world"
}

PLAY RECAP *********************************************************************
server1 : ok=3 changed=1 unreachable=0 failed=0

什麼是控制主機 Control Machine

這類主機可以透過運行 Ansible 的劇本 playbook 對被控節點進行部署

什麼是被控節點 Managed Node

也稱為遙控節點 (Remote Node)。相對於控制主機,就是我們透過 Ansible 進行部署的對象